home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMIBEST4.ADF / AmigaBasicStuff / Grids.MSB (.txt) < prev    next >
AmigaBASIC Source Code  |  1987-07-22  |  3KB  |  182 lines

  1. ' "Grids"
  2. ' by David Matthews
  3. ' freely distributable
  4. ' simple AmigaBasic pgm.
  5. ' have fun with sound waveshapes (timbre)
  6. ' and amplitude envelopes (ADSR...attack,decay,sustain,release)
  7.  
  8.  
  9.  
  10.  
  11. WINDOW 2,"TIMBRE",(60,53)-(600,186),6
  12. WINDOW 3,"ADSR" ,(330,0)-(630,49),6
  13. DEFINT a-z
  14. x = 0
  15.  
  16. REM    your tune here    
  17. FOR t = 1 TO 5 : READ tune(t) : NEXT t
  18. DATA 261.63,293.66,233.47,116.73,174.61
  19.  
  20. DIM smooth.timbre% (255) 
  21. DIM timbre% (255)
  22. DIM adsr% (40)
  23. DIM smooth.adsr% (40)
  24.  
  25. WINDOW OUTPUT 1
  26. PRINT "Click left mouse button to draw grid...."
  27. PRINT "Hold left button and drag to draw graph."
  28. PRINT "Drag off right edge to enter data......."
  29. PRINT "Press any key to hear it................"
  30.  
  31. a$ = "  mouse a graph from left to right "
  32. WINDOW OUTPUT 3
  33. PRINT : PRINT : PRINT
  34. PRINT a$
  35. WINDOW OUTPUT 2
  36. PRINT : PRINT : PRINT
  37. PRINT a$ 
  38.  
  39.  
  40. ON MOUSE GOSUB top
  41.  
  42. WHILE 1
  43.     GOSUB makeSound
  44.     MOUSE ON
  45. WEND    
  46.  
  47.  
  48. top:
  49.  MOUSE OFF 
  50.   IF WINDOW(0) = 2 THEN GOSUB TIMBREtop
  51.   IF WINDOW(0) = 3 THEN GOSUB ADSRtop
  52.   RETURN
  53.  
  54.   
  55. TIMBREtop:
  56.    WINDOW  2  : CLS
  57.    GOSUB drawTIMBREgrid
  58.    GOSUB initTIMBREarray
  59.    x = MOUSE(1)
  60.    GOSUB TIMBREmouse
  61.    RETURN
  62.      
  63. TIMBREmouse:
  64.    IF MOUSE(0) = 0 THEN TIMBREmouse
  65.    IF MOUSE(0) <> 0 THEN
  66.        IF MOUSE(1) => 10 AND MOUSE(1) <= 521 THEN
  67.            IF MOUSE(2) =< 125 AND MOUSE(2) => 1 THEN  GOSUB TIMBREdot           
  68.        END IF
  69.    END IF
  70.    IF MOUSE(1) < 522 THEN TIMBREmouse
  71.    GOSUB TIMBREread
  72.    RETURN
  73.       
  74. TIMBREdot:
  75.    x = MOUSE(1)  :  y = MOUSE(2)
  76.    n = INT ((x-10)/2 ) 
  77.    timbre(n)=y
  78.    PSET(x,y),3
  79.    RETURN
  80.       
  81. TIMBREread:
  82.    FOR x = 10 TO 521 STEP 2
  83.       y = ((x-10)\2)
  84.       z = timbre(y) * 2 - 128
  85.       IF z = -128 AND y > 0 THEN z = smooth.timbre(y-1)
  86.       smooth.timbre(y) = z   
  87.       PSET (x,129),3
  88.    NEXT x
  89.    WAVE 0,smooth.timbre
  90.    RETURN
  91.    
  92. initTIMBREarray:
  93.   FOR i = 0 TO 255
  94.      timbre(i)=0
  95.   NEXT i
  96. RETURN
  97.  
  98. drawTIMBREgrid:
  99. x = 0 : y =1 : y1 = 126
  100. FOR i = 2 TO 59
  101.    x = x + 9
  102.    IF i = 31 THEN c = 1 :ELSE c = 2
  103.    LINE (x,y)-(x,y1),c
  104. NEXT i
  105. x = 10 : y= 1 : x1 = 521
  106. FOR i = 1 TO  26
  107.    IF i = 13 THEN c = 1 :ELSE c = 2
  108.    LINE (x,y)-(x1,y),c
  109.    y = y + 5
  110. NEXT i
  111. RETURN
  112.  
  113.   
  114. ADSRtop:
  115.    WINDOW  3  : CLS
  116.    GOSUB drawADSRgrid
  117.    GOSUB initADSRarray
  118.    x = MOUSE(1)
  119.    GOSUB ADSRmouse
  120.    RETURN
  121.      
  122. ADSRmouse:
  123.    IF MOUSE(0) = 0 THEN ADSRmouse
  124.    IF MOUSE(0) <> 0 THEN
  125.        IF MOUSE(1) => 20 AND MOUSE(1) <=260 THEN
  126.            IF MOUSE(2) =< 40 AND MOUSE(2) => 1 THEN  GOSUB ADSRdot           
  127.        END IF
  128.    END IF
  129.    IF MOUSE(1) < 261 THEN ADSRmouse
  130.    GOSUB ADSRread
  131.    RETURN
  132.       
  133. ADSRdot:
  134.    x = MOUSE(1)  :  y = MOUSE(2)
  135.    n = INT ((x-20) / 6)
  136.    adsr(n)=y
  137.    PSET(x,y),3
  138.    RETURN
  139.      
  140. ADSRread:
  141.    FOR x = 0 TO 39
  142.       z = 240 - adsr(x) * 6 
  143.       IF z = 240 AND x > 0 THEN z = smooth.adsr(x-1)
  144.       smooth.adsr(x) = z   
  145.       PSET ((x*6)+20,43),3
  146.    NEXT 
  147.    RETURN
  148.    
  149. drawADSRgrid:
  150. x = 10 : y =1 : y1 = 40
  151. FOR i =  1 TO 25
  152.    x = x + 10
  153.    IF i = 1 THEN c = 1 :ELSE c = 2
  154.    LINE (x,y)-(x,y1),c
  155. NEXT i
  156. x = 20 : y= 1 : x1 = 260
  157. FOR i = 1 TO  9
  158.    IF i = 9 THEN c = 1 :ELSE c = 2
  159.    LINE (x,y)-(x1,y),c
  160.    y = y + 5
  161. NEXT i
  162.   RETURN
  163.  
  164. initADSRarray:
  165.   FOR i = 0 TO 39
  166.      adsr(i)=0
  167.   NEXT i
  168. RETURN
  169.  
  170.  
  171. makeSound:
  172.   IF INKEY$ = "" THEN RETURN
  173.     MOUSE OFF 
  174.     FOR t = 1 TO 5
  175.     n = tune(t)
  176.     FOR i = 0 TO 39    
  177.       SOUND n,0.2,(smooth.adsr(i)),0
  178.     NEXT i
  179.     NEXT t
  180.     RETURN
  181.  
  182.